int climbStairs(int n) {
    // step 1# 处理特殊情况：如果n <= 2，直接返回n
    if (n <= 2)
        return n;

    // step 2# 定义并初始化dp数组，大小为n+1
    int *dp = (int *)malloc(sizeof(int) * (n + 1));
    dp[0] = 0; // 0阶楼梯，0种方法
    dp[1] = 1; // 1阶楼梯，1种方法
    dp[2] = 2; // 2阶楼梯，2种方法（1+1 或 2）

    // step 3# 动态规划递推公式：dp[i] = dp[i-1] + dp[i-2]
    for (int i = 3; i <= n; ++i) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }

    // step 4# 返回到达第n阶楼梯的方法数
    return dp[n];
}
